perm filename GRPALG.RLS[225,JMC] blob sn#005367 filedate 1971-01-28 generic text, type T, neo UTF8
00100	OFF ECHO;
00200	COMMENT MAPP APPLIES A PERMUTATION TO AN ELEMENT.  MAPCY
00300	APPLIES A CYCLE.;
00400	
00500	MAPP(PER,EL) ← IF NULL PER THEN EL 
00600		ELSE IF ATOM CAR PER THEN MAPCY(PER,EL)
00700		ELSE (LAMBDA W; IF W EQ EL THEN MAPP(CDR PER,EL)
00800				ELSE W)
00900			MAPCY(CAR PER,EL);
01000	
01100	MAPCY(CYC,EL) ← IF NOT MEMBER(EL,CYC) OR NULL CDR CYC THEN EL
01200			ELSE IF EL EQ CAR CYC THEN CADR CYC
01300			ELSE MAPCY1(CAR CYC,CDR CYC,EL);
01400	
01500	MAPCY1(X,U,EL) ← 
01600			IF EL EQ CAR U THEN
01700				(IF NULL CDR U THEN X ELSE CADR U)
01800			ELSE MAPCY1(X,CDR U,EL);
01900	
02000	COMMENT  GCYC(U,V,X) IS THE CYCLE IN THE PRODUCT OF THE
02100	PERMUTATIONS  U  AND  V  THAT STARTS WITH  X, BUT IT'S NIL
02200	IF THE CYCLE HAS LENGTH 1.;
02300	
02400	GCYC(U,V,X) ← (LAMBDA W; IF  W EQ X THEN NIL
02500				ELSE X.GCYC1(U,V,X,W))
02600			MAPP(U,MAPP(V,X));
02700	
02800	GCYC1(U,V,X,W) ←  IF W EQ X THEN NIL
02900				ELSE (LAMBDA Z; W . GCYC1(U,V,X,Z))
03000					MAPP(U,MAPP(V,W));
03100	
03200	COMMENT SORT U  IS THE LIST  U  SORTED IN ASCENDING ORDER.  SORT
03300	USES  ENTER(X,U)  WHICH IS THE RESULT OF ENTERING  X  INTO
03400	THE SORTED LIST  U.  SUBT(U,V)  IS THE SET
03500	DIFFERENCE OF THE LISTS  U  AND  V.;
03600	
03700	SORT U ← IF NULL U THEN NIL ELSE ENTER(CAR U,SORT CDR U);
03800	
03900	ENTER(X,U) ← IF NULL U THEN LIST X
04000		ELSE IF X = CAR U THEN U
04100		ELSE IF X > CAR U THEN CAR U . ENTER(X,CDR U)
04200		ELSE X.U;
04300	
04400	SUBT(U,V) ← IF NULL U THEN NIL
04500		ELSE IF CAR U MEMBER V THEN SUBT(CDR U,V)
04600		ELSE CAR U . SUBT(CDR U,V);
04700	
04800	
04900	COMMENT  MERGEA(U,V)  COMBINES THE TWO ORDERED LISTS  U  
05000	AND  V  ELIMINATING DUPLICATIONS.  APPL  U  IS THE RESULT
05100	OF APPENDING THE SUBLISTS OF THE LIST  U.;
05200	
05300	MERGEA(U,V) ← IF NULL U THEN V
05400			ELSE IF NULL V THEN U
05500			ELSE IF CAR U EQ CAR V THEN MERGEA(U,CDR V)
05600			ELSE IF CAR U < CAR V THEN 
05700					CAR U . MERGEA(CDR U,V)
05800			ELSE CAR V . MERGEA(U,CDR V);
05900	
06000	APPL U ← IF NULL U THEN NIL
06100		ELSE IF ATOM CAR U THEN U
06200		ELSE APPEND(CAR U,APPL CDR U);
06300	
06400	COMMENT  MUL(U,V)  IS THE PRODUCT OF THE PERMUTATIONS  U  AND
06500	V.;
06600	
06700	MUL(U,V)← (LAMBDA W; IF NULL W THEN NIL
06800			ELSE IF NULL CDR W THEN CAR W
06900			ELSE W)
07000		MUL1(U,V,MERGEA(SORT APPL U,SORT APPL V));
07100	
07200	MUL1(U,V,L) ← IF NULL L THEN NIL
07300			ELSE (LAMBDA Z; IF NULL Z THEN MUL1(U,V,CDR L)
07400					ELSE Z . MUL1(U,V,SUBT(L,Z)))
07500				GCYC(U,V,CAR L);
07600	
07700	COMMENT  Elements of the group algebra are represented by
07800	lists in which each permutation is preceded by its
07900	coefficient.  Thus 2+3(12)-4(12)(34)  is represented by
08000	(2 NIL 3 (1 2) -4 ((1 2) (3 4))).
08100		prod(u,v) is the product of two elements of the group
08200	algebra with the terms ordered by class and within classes
08300	lexicographically.  A class is represented by a list of
08400	pairs each of which is a cycle length preceded by the
08500	number of cycles of that length.  Thus (5 5 3 3 3 2) is
08600	represented by ((2 5)(3 3)(1 2)).  Ones are not
08700	represented because the algorithms are independent of the
08800	total number of letters being permuted.  A class  c1  precedes
08900	a class  c2  in the ordering if it has a bigger cycle sooner.;
09000	
09100	PROD(U,V) ← PRODA(U,V,NIL);
09200	
09300	PRODA(U,V,L) ← IF NULL U THEN L
09400			ELSE PRODA(CDDR U,V,PRODB(CAR U,CADR U,V,L));
09500	
09600	PRODB(N,PER,V,L) ← IF NULL V THEN L
09700			ELSE PRODB(N,PER,CDDR V,ENTERA(N*(CAR V),
09800					MUL(PER,CADR V),L));
09900	
10000	ENTERA(N,PER,U) ←
10100		IF NULL U THEN LIST(N,PER)
10200		ELSE IF ISPREC(PER,CADR U) THEN N.(PER.U)
10300		ELSE IF PER = CADR U THEN
10400			(LAMBDA W; IF W=0 THEN CDDR U ELSE W.CDR U)
10500				(N + CAR U)
10600		ELSE CAR U . (CADR U . ENTERA(N,PER,CDDR U));
10700	
10800	ISPREC(P1,P2) ←
10900		(LAMBDA C1,C2; IF C1 = C2 THEN ISPRECB(APPL P1,APPL P2)
11000				ELSE ISPRECA(C1,C2))
11100		(CLASS P1,CLASS P2);
11200	
11300	CLASS P ←
11400		IF NULL P THEN NIL
11500		ELSE IF ATOM CAR P THEN LIST LIST(1,LENGTH P)
11600		ELSE ENTERB(LENGTH CAR P,CLASS CDR P);
11700	
11800	ENTERB(N,CL) ←
11900		IF NULL CL THEN LIST LIST(1,N)
12000		ELSE IF N = CADAR CL THEN
12100			(LAMBDA U; IF U=0 THEN CDR CL
12200					ELSE (U. CDAR CL) . CDR CL)
12300			ADD1 CAAR CL
12400		ELSE IF N > CADAR CL THEN LIST(1,N).CL
12500		ELSE CAR CL . ENTERB(N,CDR CL);
12600	
12700	ISPRECB(L1,L2) ←
12800		IF NULL L1 THEN NIL
12900		ELSE IF NULL L2 THEN T
13000		ELSE IF CAR L1 > CAR L2 THEN T
13100		ELSE IF CAR L1 < CAR L2 THEN NIL
13200		ELSE ISPRECB(CDR L1,CDR L2);
13300	
13400	ISPRECA(C1,C2) ←
13500		(LAMBDA M1,M2; IF M1 < M2  THEN NIL
13600			ELSE IF M1=M2 THEN ISPRECC(C1,C2)
13700			ELSE T)
13800		(SIZE C1,SIZE C2);
13900	
14000	SIZE C ← IF NULL C THEN 0 ELSE CAAR C * CADAR C + SIZE CDR C;
14100	
14200	ISPRECC(C1,C2) ←
14300		IF NULL C1 THEN NIL
14400		ELSE IF NULL C2 THEN T
14500		ELSE IF CADAR C1 > CADAR C2 THEN T
14600		ELSE IF CADAR C1 < CADAR C2 THEN NIL
14700		ELSE IF CAAR C1 > CAAR C2 THEN T
14800		ELSE IF CAAR C1 < CAAR C2 THEN NIL
14900		ELSE ISPRECC(CDR C1,CDR C2);
15000	
15100	COMMENT  inv x  is the inverse of the permutation  x.;
15200	
15300	INV X ← MUL(NIL,INVA X);
15400	
15500	INVA X ← 
15600		IF NULL X THEN NIL
15700		ELSE IF ATOM CAR X THEN REVERSE X
15800		ELSE (REVERSE CAR X) . INVA CDR X;
     

00100	INITFN '(LAMBDA NIL (BEGIN));